package com.lft.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * 1. 整合MyBatis-Plus
 * 		1）导入依赖
 * 			<dependency>
 * 			<groupId>com.baomidou</groupId>
 * 			<artifactId>mybatis-plus-boot-starter</artifactId>
 * 			<version>3.3.1</version>
 * 			</dependency>
 * 		2）配置
 * 			① 配置数据源;
 * 				导入数据库的驱动
 * 				在 application.yml 中配置数据源相关信息
 * 			② 配置 MyBatis-Plus;
 * 				使用 @MapperScan
 * 				在 application.yml 中配置 MyBatis-Plus 的 sql 映射文件位置
 * 	2. 逻辑删除
 *		1） 配置全局的逻辑删除规则(可以省略)
 *
 *		2） 配置逻辑删除的组件（3.1.1开始不需要这一步）
 * //		@Configuration
 * //		public class MyBatisPlusConfiguration{
 * //			@Bean
 * //			public ISqlInjector sqlInjector(){
 * //			 	  return new LogicSqlInjector();
 * //			}
 * //		}
 *
 *		3) 在实体类Bean字段上加上 @TableLogic 逻辑删除注解（since 3.3.0,全局配置了 logic-delete-field: flag后可以忽略不配置此步骤）
 * //		@TableLogic
 * //		private Integer deleted;
 *
 * 		4） 分组校验（多场景的）
 *			① 在Entity类的属性上的注解 @NotBlank (message = "品牌名不能为空", groups = {AddGroup.class, UpdateGroup.class}) 标注什么情况需要进行校验。
 *			② 在Controller上的方法的形参中添加 @Validated ({UpdateGroup.class}) 注解，指定哪种情况下需要校验。
 *			③ 默认没有指定分组的校验注解 @NotBlank，在分组校验情况 @Validated ({UpdateGroup.class}) 下不生效，只会在 @Validated({AddGroup.class}) 生效。
 *
 *		5） 自定义校验
 *			① 编写一个自定义的校验注解（com.lft.common.valid.ListValue）
 *			② 编写一个自定义的校验器（com.lft.common.valid.ListValueConstraintValidator）
 *			③ 关联自定义的校验器和自定义的校验注解
 *				@Documented
 * 				@Constraint (validatedB y = {ListValueConstraintValidator. class}) // 可以指定多个不同的校验器，适配不同类型的校验
 * 				@Targ et ({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYP E_USE})
 * 				@Retention (RUNTIME)
 * 				public @interface ListValue {
 * 					String message() default "{com.lft.common.valid.ListValue.message}";
 *
 * 					Class<?>[] groups() default {};
 *
 * 					Class<? extends Payload>[] payload() default {};
 *
 * 					int[] values() default {};
 * 				}
 *
 *	3. JSR303数据校验
 *		1） 给 Bean 添加校验注解：在包（javax.validation.constraints）中，并定义自己的错误提示消息message
 *		2） 开启校验功能。在请求的Controller方法形参中，加上（@Valid）注解。
 *				// @RequestMapping ("/save")
 *				public R save(@Valid @RequestBody BrandEntity brand) {
 *					brandService.save(brand);
 *					return R.ok();
 *				}
 *			效果：校验错误以后会有默认的响应
 *		3） 给校验的 bean 后紧跟一个 BindingResult result,就可以获取到校验的结果。
 *
 *	4. 统一的异常处理（@ControllerAdvice）
 *		1） 编写异常处理类，在类上加 @ControllerAdvice 注解。
 *		2） 使用 @ExceptionHandler 标注方法可以处理的异常。
 *
 */
@MapperScan ("com.lft.gulimall.product.dao")
@SpringBootApplication
@EnableDiscoveryClient
public class GulimallProductApplication {
	
	public static void main(String[] args) {
		SpringApplication.run(GulimallProductApplication.class, args);
	}
	
}
